package com.example.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;

public class ConfigConversionUtils {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    // 将 String 转换为指定的类型
    public static <T> T convert(String value, Class<T> targetType) {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        try {
            if (targetType == String.class) {
                return targetType.cast(value);
            } else if (targetType == Integer.class) {
                return targetType.cast(Integer.parseInt(value));
            } else if (targetType == Long.class) {
                return targetType.cast(Long.parseLong(value));
            } else if (targetType == Boolean.class) {
                return targetType.cast(Boolean.parseBoolean(value));
            } else if (targetType == Double.class) {
                return targetType.cast(Double.parseDouble(value));
            }
            // 默认情况返回 null
            return null;
        } catch (Exception e) {
            throw new IllegalArgumentException("无法将字符串转换为目标类型: " + targetType.getName(), e);
        }
    }

    // 专门处理 List 类型的转换
    public static <T> List<T> convertToList(String value, Class<T> elementType) {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        try {
            // 使用 TypeReference 来处理 List 中的泛型类型
            return objectMapper.readValue(value, objectMapper.getTypeFactory().constructCollectionType(List.class, elementType));
        } catch (Exception e) {
            throw new IllegalArgumentException("无法将字符串转换为 List 类型", e);
        }
    }

    // 专门处理 Map 类型的转换
    public static <K, V> Map<K, V> convertToMap(String value, Class<K> keyType, Class<V> valueType) {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        try {
            // 使用 TypeReference 来处理 Map 中的泛型类型
            return objectMapper.readValue(value, objectMapper.getTypeFactory().constructMapType(Map.class, keyType, valueType));
        } catch (Exception e) {
            throw new IllegalArgumentException("无法将字符串转换为 Map 类型", e);
        }
    }
}
